package com.hwadee.property.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hwadee.property.mapper.UserMapper;
import com.hwadee.property.pojo.User;
import com.hwadee.property.service.IUserService;
import com.hwadee.property.dto.PageResult;
import com.hwadee.property.util.DateUtil;
import com.hwadee.property.util.ErrorCodes;
import com.hwadee.property.util.BusinessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.util.Collections;
import java.util.Date;
import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 根据用户类型查询用户列表
     * @param userType 用户类型（1-业主，2-物业）
     * @return 用户列表
     */
    @Override
    public List<User> listByUserType(Integer userType) {
        if (userType == null) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "用户类型不能为空");
        }
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_type", userType);
        return this.list(queryWrapper);
    }

    /**
     * 根据小区 ID 查询用户列表
     * @param communityId 小区 ID
     * @return 用户列表
     */
    @Override
    public List<User> listByCommunityId(Long communityId) {
        if (communityId == null) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "小区 ID 不能为空");
        }
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("community_id", communityId);
        return this.list(queryWrapper);
    }

    /**
     * 分页查询用户
     * @param current 当前页
     * @param size 页面大小
     * @param name 查询条件
     * @param account 查询条件
     * @param identification 查询条件
     * @param phone 查询条件
     * @param email 查询条件
     * @param sex 查询条件
     * @param age 查询条件
     * @param communityId 查询条件
     * @param userType 查询条件
     * @param freeze 查询条件
     * @return 分页数据
     */
    @Override
    public PageResult<User> getPage(int current, int size, String name, String account,
                                    String identification, String phone, String email,
                                    String sex, Integer age, Long communityId, Integer userType, Integer freeze) {
        // 确保 current 至少为 1
        current = Math.max(current, 1);
        size = Math.max(size, 1);

        // 计算 OFFSET
        int offset = (current - 1) * size;

        // 查询总数
        int total = userMapper.countUsers(name, account, identification, phone, email, sex, age, communityId, userType, freeze);

        // 查询数据
        List<User> records = (total > 0) ? userMapper.getUsers(name, account, identification, phone, email, sex, age, communityId, userType, freeze, size, offset) : Collections.emptyList();

        // 封装分页结果
        return new PageResult<>(total, current, size, records);
    }

    /**
     * 根据手机号码查询用户
     * @param phone 手机号码
     * @return 用户对象，如果不存在则返回 null
     */
    @Override
    public User getByPhone(String phone) {
        if (phone == null || phone.isEmpty()) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "手机号不能为空");
        }
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("phone", phone);
        return this.getOne(queryWrapper);
    }

    /**
     * 更新用户信息（自定义更新逻辑）
     * @param user 用户对象（包含需要更新的字段）
     * @return 更新成功返回 true，失败返回 false
     */
    @Override
    public boolean updateUser(User user) {
        if (user == null) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "用户对象不能为空");
        }
        if (user.getId() == null) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "用户 ID 不能为空");
        }
        user.setUpdateTime(DateUtil.dateToString(new Date())); // 设置更新时间
        return this.updateById(user);
    }

    /**
     * 注册新用户（自定义注册逻辑）
     * @param user 用户对象（包含注册信息）
     * @return 注册成功返回 true，失败返回 false
     */
    @Override
    public boolean registerUser(User user) {
        if (user == null) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "用户对象不能为空");
        }
        if (user.getPhone() == null || user.getPhone().isEmpty()) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "手机号不能为空");
        }
        if (user.getCreateTime() == null) {
            user.setCreateTime(DateUtil.dateToString(new Date())); // 设置创建时间
        }
        user.setUpdateTime(DateUtil.dateToString(new Date())); // 设置更新时间
        return this.save(user);
    }

    /**
     * 删除用户（根据用户 ID）
     * @param id 用户 ID
     * @return 删除成功返回 true，失败返回 false
     */
    @Override
    public boolean deleteUserById(Long id) {
        if (id == null) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "用户 ID 不能为空");
        }
        return this.removeById(id);
    }

    @Override
    public User doLogin(User user) {
        // 检查用户对象是否为空
        if (ObjectUtils.isEmpty(user)) {
            return null;
        }

        // 检查用户名和密码是否为空
        if (!StringUtils.hasLength(user.getAccount()) || !StringUtils.hasLength(user.getPassword())) {
            return null;
        }

        // 使用 LambdaQueryWrapper 查询用户名
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getAccount, user.getAccount());

        // 查询用户
        List<User> users = baseMapper.selectList(queryWrapper);
        if (users == null || users.isEmpty()) {
            return null;
        }

        // 获取查询结果中的第一个用户
        User bean = users.get(0);

        // 检查密码是否匹配
        if (user.getPassword().equals(bean.getPassword())) {
            return bean;
        }

        return null;
    }

    @Override
    public List<User> listPropertiesByCommunityId(Long id) {
        if (id == null) {
            throw new BusinessException(ErrorCodes.INVALID_PARAMETER, "小区 ID 不能为空");
        }
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("community_id", id)
                .eq("user_type", 2); // 添加 user_type == 2 的条件
        return this.list(queryWrapper);
    }

    @Override
    public int getUserCountByCommunityId(Long communityId) {
        return listByCommunityId(communityId).size();
    }

    @Override
    public int getUserCountByCommunityIdAndUserType(Long communityId, int userType) {
        if (userType == 1)
            return listByCommunityId(communityId).size() - listPropertiesByCommunityId(communityId).size();
        else
            return listPropertiesByCommunityId(communityId).size();
    }

}
